{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Run benchmarks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "os.environ['SPARK_HOME'] = '/cluster/home/roskarr/spark'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import findspark\n",
    "findspark.init()\n",
    "\n",
    "import sparkhpc\n",
    "import pyspark\n",
    "import time\n",
    "import csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "sj = sparkhpc.sparkjob.LSFSparkJob(jobid=31640721)\n",
    "#sj.submit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sj.job_started()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'config_dir': None,\n",
       " 'follow_up_script': '',\n",
       " 'jobid': '31640721',\n",
       " 'jobname': 'sparkcluster',\n",
       " 'memory': '2000',\n",
       " 'ncores': '4',\n",
       " 'spark_home': '/cluster/home/roskarr/spark',\n",
       " 'status': None,\n",
       " 'template': None,\n",
       " 'walltime': '00:30'}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sj.prop_dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "sc = pyspark.SparkContext(master=sj.master_url())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import cnat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "for n in [800000,1600000,3200000]:\n",
    "    strings = cnat.random_strings.generate_random_sequences(n)\n",
    "    timein = time.time()\n",
    "    mat = cnat.process_strings.produce_network(strings, min_ld=1, max_ld=10, sc=sc)\n",
    "    mat.count()\n",
    "    timeout = time.time()\n",
    "    with open('../cdr3_analyze_benchmark.csv','a') as f:\n",
    "        writer = csv.DictWriter(f, fieldnames = ['nstrings', 'ncores', 'spark', 'type', 'min_ld', 'max_ld', 'dt'])\n",
    "        writer.writerow({'nstrings': n, 'spark': True, 'ncores': 160, 'dt': timeout-timein, 'type': 'graph',\n",
    "                                 'min_ld': 1, 'max_ld':10})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot runtime results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "plt.style.use('fivethirtyeight')\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "font = {'family' : 'normal',\n",
    "        'weight' : 'normal',\n",
    "        'size'   : 16}\n",
    "\n",
    "plt.rc('font', **font)\n",
    "plt.rcParams['text.usetex']= False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "plt.rcParams['figure.figsize'] = [10,8]\n",
    "#plt.rcParams['font.size']=14\n",
    "plt.rcParams['axes.labelsize']='x-large'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "df = pd.read_csv('../cdr3_analyze_benchmark.csv', index_col='nstrings')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "df = df[(df.index>=100000) & (df.index < 2000000) & (df['ncores']>20)].sort_values(by=['ncores']).sort_index()[['dt','ncores']]#[df['ncores']<300]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArsAAAIpCAYAAACizfDKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xmcj/X+//HHa7IvYwxG2TOctGmhtJAGoTiUktDJaDsS\nlaKvloOitA/aVWKyhMp2KmRLRaGOUkli1EH2Zc4YRpn394/rM9Psy2c+s30877fb3Ma8r9d1Xa9r\nPvPt9zzX7329L3POISIiIiISjEKKuwERERERkcKisCsiIiIiQUthV0RERESClsKuiIiIiAQthV0R\nERERCVoKuyIiIiIStEpk2DWzumb2opmtMrMjZpZsZg0y1LQ3s2lmttXMEs3sFzN7xcxqZXG88mb2\nrJnt9NWuMrM2WdSZmT1kZnFmdtTM1ptZj8K8VhEREREpPCUy7AJNgBuAA8BKIKvFgP8J1ATGAJ2A\nJ4FuwGozq5ShdhJwG/Ao0AX4HVhkZs0z1I0BRgATgM7AamC2mXUOwDWJiIiISBGzkv5SCTO7DZgI\nnO6c+y3NeA3n3P4MtW2AT4FbnXOTfWPnAf8Bop1zsb6xU4AfgJ+cc9f6xmoB/wWedM49nuaYS4Ca\nzrnzC+8qRURERKQwlNQ7u7nKGHR91vq+100z1g04DsxKs+8J4F2gk5mV9Q13BsoC0zIccypwrpk1\nDETfIiIiIlJ0Sm3YzcaVvu8b04ydBcQ5545lqP0BKIc3ZSKlLsk5tyWLOvNtFxEREZFSJGjCrplV\nAcbhhdO5aTaFAwez2OVAmu0p3w/loU5ERERESokyxd1AIPjm4L4LnAZc5pxLLorzHj58uGRPeBYR\nERE5iVSrVs0yjpX6O7tmZkAs0A7o7pz7IUPJQaB6Frum3Kk9kKYuLA91IiIiIlJKlPqwC7wO9AR6\nOedWZLH9B+B0M6uQYfxsvAfXfklTV97MGmdR54AfA9axiIiIiBSJUh12zex54Fa8ZcUWZFO2AO9B\ntJ5p9jsFuBFY5Jz7wze8EPgT6Jth/5uB751zvway99Js8+bNxd2CFAF9zicPfdYnB33OJw991umV\n2Dm7Zna9758t8VZDuMbM9gJ7nXMrzez/gCHAW8AWM2uVZve9zrmtAM659WY2ExhnZuWAOGAg0Ajo\nnbKDc26vmb0APGRmCcA3wE14Kzz8vfCuVEREREQKS4kNu8Bs/npzmgNe9v37U7z5uZ1947f6vtKa\nkmEsGngCGI03L/dboJNz7tsM+z0M/A+4BzgV2AT0dM59XPDLEREREZGiVmLDrnMuxykWzrmofBwr\nCRjq+8qpzuG9dvjJvB5bREREREquUj1nV0REREQkJwq7IiIiIhK0FHZFREREJGgp7Eq+1a1bt7hb\nEBEREckThV3Jt0qVKhV3CyIiIiJ5orArIiIiIkFLYVdEREREgpbCroiIiIgELYVdEREREQlaCrsi\nIiIiErQUdkVEREQkaCnsioiIiEjQUtgtIaZPn0716tVp1KgRhw8fTrftxIkTVK9enaeffrrI+xo7\ndizVq1cnOTm5yM+dH845hg8fTrNmzQgPD+fmm28u7pZERESkBFDYLWHi4+MZP358cbeRyswws+Ju\nI1fz5s3j9ddf59577+WTTz7h8ccfL+6WREREpARQ2C1h2rVrx8SJE9m3b19xt1Jkjh8/XuBj/PTT\nT5gZd911Fy1atKBx48YB6Cz/AnEtIiIiEjgKuyWImTF06FCcczz77LM51qZML8jorrvuonnz5qk/\n//bbb1SvXp23336bxx9/nDPOOIP69etz5513cuzYMbZu3cr1119PvXr1uPDCC5kxY0aW5/vpp5/4\n+9//Tp06dWjWrBlPPvlkppr9+/czZMgQzjrrLGrXrs3FF1/MlClT0tWkTNdYtWoV0dHRNGzYkA4d\nOuR4rUuWLKFjx46cdtppNGjQgL59+/LLL7+kbm/evHnqFI/q1asTHh6e7XWANy1k3LhxXHLJJZx6\n6qk0adKEnj17pjvmL7/8Qt++fWnYsCGnnXYaV111FUuXLk13nJTPYOPGjam/w/79+6dunz9/Pldd\ndRV16tShYcOGREdHs3379nTHmD17NldccQX16tWjQYMGXHbZZZl+ZyIiIuI/hd0S5tRTT+WOO+5g\nypQpmYJRWtlNL8huPCYmhl27dvHaa6/x8MMPM2fOHO677z5uvvlmOnXqxLRp0zj77LMZNGgQmzZt\nSrevc46bb76ZqKgopk+fTs+ePXn22WfTzSH+3//+R6dOnViyZAkPPfQQs2bN4uqrr+b+++/njTfe\nyNTPnXfeSaNGjYiNjWXUqFHZXueSJUvo1asXVatWZfLkycTExLBx40Y6d+7Mrl27AJg2bRp9+vQB\nYOnSpXzyySd06tQp22P279+fJ554gk6dOjF9+nQmTJjAGWeckXq8Xbt20alTJ3788Ueef/55Jk+e\nTFhYGDfeeGO6wJvye+7bty+tW7dmxowZDBw4EIBJkybRr18/zjzzTGJjYxk/fjwbN26ka9euHDly\nBIDVq1fzz3/+kzZt2jBt2jRiY2OJjo7ONGdbRERE/FemuBuQzO677z7efvttnn76aV588cWAHLNx\n48a88sorAERFRbFq1SpmzZrFxIkTueGGGwA477zz+Pjjj5k3bx4PPvhg6r5mRnR0NPfccw8AV155\nJfHx8bz88svcddddhIaG8uqrr7Jjxw5Wr15No0aNAGjbti2HDh3i6aef5rbbbiMk5K//bXXttdfm\nGHJTjBkzhtNPP53Zs2en7t+yZUtatmzJSy+9xJgxYzj33HM57bTTALjwwgtzPN6nn37KggULeOaZ\nZ7jjjjtSx6+55prUf7/00kvEx8ezdOnS1Gu56qqraNWqFaNHj6Z9+/bpfjcDBgzgzjvvTB07cuQI\no0aN4h//+AcTJkxIHb/wwgtp2bIl77zzDgMGDGDdunWEhYXxxBNPpNZceeWVuf5OREREJO90Z7cE\nCgsLY9CgQbz77rts2bIlIMdMG9AA/va3vwHeHOG0561VqxY7duzItH/37t3T/dyjRw8SEhLYuHEj\nAMuWLaNFixbUr1+fEydOpH61a9eO/fv389NPP6Xua2Z06dIl154TExP57rvvuO6669IF5YYNG9Kq\nVSu++OKLPFx5eitWrCAkJIRbbrkl25rVq1fTsmXL1KALEBISwvXXX8+GDRtISEhIV5/xWtauXUtC\nQgI33HBDut9FnTp1aNq0KatWrQK88Hvo0CHuvPNOFi1apDu6IiIihUBht4QaOHAgYWFhWc6N9UdY\nWFi6n8uWLZvt+LFjxzLtHxERkeln5xy///47AHv37mXVqlXUrFkz3Vd0dDRmxoEDB9Ltf+qpp+ba\n86FDh3DOZVlbu3ZtDh48mOsxMjpw4ADVq1enfPny2dYcPHgw23M65zh06FC68Yy1e/fuxTlH9+7d\n0/0uatWqxcaNG1N/F5dffjmTJ09m586d/OMf/6BJkyZce+21/PDDD/m+LhEREcmapjGUUJUrV2bI\nkCH861//YvDgwZm2V6hQAYA///yTMmX++hgzhspA2bNnDw0bNkz3M0CdOnUACA8PJyIigqeeegrn\nXKb9mzZtmu7nvCxnFhYWhpmxe/fuTNt2796d5QN6ualRowYHDx4kKSkp28BbvXr1LM+5a9cuzCzT\n/0DIeC3h4eEAvPbaa5xxxhmZjlO1atXUf3fr1o1u3bqRmJjI559/zsiRI+nZsyc//vhjvq9NRERE\nMtOd3RLs9ttv57TTTmPMmDGZAlX9+vUB0oWiQ4cOsWbNmkLpZe7cuel+fv/996latSpnnnkm4E2T\n+Pnnn6lXrx7nn39+pq/KlSvn+5yVKlXi/PPPZ968eekC9G+//caaNWto06ZNvo8ZFRVFcnIysbGx\n2dZcfvnlrFu3jv/+97+pY8nJycyZM4fzzjuPKlWq5HiOiy++mKpVq7Jly5YsfxeRkZFZXmvHjh2J\njo5m165dhfY/WkRERE42urNbgpUrV44HH3yQe++9N1PY7dChA1WrVuXee+9l+PDhHDt2jBdffNGv\nUJkb5xxTpkzhxIkTXHjhhSxZsoSpU6fy0EMPpd6lHDhwIHPnzqVz584MHDiQJk2akJiYyM8//8zq\n1auZPn26X+d+5JFH6NWrFzfeeCO33XYbCQkJPPXUU4SFhXH33Xfn+3ht2rShW7duPPLII2zfvp0r\nrriCP/74g1WrVtGpUycuv/xyBg4cyIwZM7juuusYPnw4VapU4a233mLr1q3Mnj0713NUrVqVxx9/\nnGHDhrFv3z46dOhAaGgov//+O1988QVt2rTh+uuv58knn2Tv3r20adOGU089lR07dvD666/TvHnz\n1LvDIiIiUjC6s1vC9e3bN8s7gdWqVWPWrFmEhIRw6623MmbMGP75z39yxRVXZKrNbspAXpcuCwkJ\nYfr06Sxfvpw+ffrw3nvvMWzYMIYNG5ZaExoayqJFi+jYsSPjx4/nhhtuYPDgwXz88cdZ9pRX7du3\nZ9asWcTHx3PrrbfywAMP0KxZMz7++GNq166dp+vM6O2332b48OF89NFH9OnTh8GDB7Np06bUuben\nnnoqCxcupFmzZjzwwAP079+fw4cPM3v2bKKiovJ0zujoaGbMmMEvv/zCgAED6NWrF08//TQnTpzg\n3HPPBbxVJf773//yyCOP0KNHDx577DHatGnDzJkz8/trEhERkWxYVvMrJW8OHz6sX54Erc2bN2ea\nay3BSZ/1yUGf88njZP6sq1WrlukulO7sioiIiEjQUtgVERERkaClsCsiIiIiQUthV0RERESClsKu\niIiIiAQthV0RERERCVoKuyIiIiIStBR2RURERCRoKeyKiIiISNBS2BURERGRoKWwKyIiIiJBS2FX\nRERERIJWmeJuQArPziN/svtocnG3kUntiiHUqaw/PRERESl8ShxBbPfRZIasOlTcbWQSc1kYdSoH\n/rhDhw7lrbfewszYsmUL1atXT7d9z549jB49mk8++YRDhw5Rr149brzxRoYMGULZsmUD35CIiIgU\nO4VdCQorV65k0qRJVKlShSNHjmTavmfPHtq1a8fvv/9O165diYyMZPXq1YwdO5a1a9cye/bsYuha\nRERECpvCrpR6iYmJ3HPPPXTt2pUDBw6watWqTDUjRoxg586dvPDCC0RHR6eODxw4kHfffZfp06fT\np0+fIuxaREREioIeUJNSb+TIkRw+fJjnnnsuy+0JCQnMnTuXRo0apQu6KfuGhIQQGxtbBJ2KiIhI\nUdOdXSnVPv/8c9566y1eeuklIiIisqxZu3YtSUlJREVFZdpWu3ZtzjnnHL7++muOHz9OuXLlCrtl\nERERKUK6syul1tGjRxk8eDBRUVE5TkHYsmULAI0bN85ye2RkJCdOnGDbtm2F0aaIiIgUI93ZlVJr\n5MiR7Nu3j3nz5uVYFx8fj5kRGhqa5faU8fj4+ID3KCIiIsVLYVdKpVWrVvHmm28yduxYGjRoUNzt\niIiISAmlaQxS6pw4cYJBgwZx0UUXceedd2ZZ45xL/XdoaCjOuWzv3KaMZ3fnV0REREov3dmVUich\nIYG4uDi2bdtGeHh4pu1mRmRkJGbGt99+S2RkJABbt27N8nhbtmwhJCSERo0aFWbbIiIipUp8fDwJ\nCQn52qdKlSol7uaRwq6UOuXLl+eWW27JctuiRYvYs2cPvXr1okKFClStWpWWLVtSrlw5li9fnql+\n9+7dfP/991x00UVaiUFERCSNhIQEPvzww3zt06VLF4VdkYKqUKEC48ePz3Jb165d2bNnD2PHjk33\nuuAePXowc+ZMJk2axK233po6PmrUKJKTk7MNzyIiIlK6KezKSWHUqFF89tlnDBs2jBUrVtCkSRNW\nrVrFmjVr6NChA7179y7uFkVERKQQKOwGsdoVQ4i5LKy428ikdsXCfS7SzDKfs3Ztli1bxpgxY1i8\neDGLFy+mXr16PPzww9x7772F2o+IiIgUH4XdIFanchnqVC7uLorWv//972y3RUREMGHChCLsRkRE\nRIqblh4TERERkaClsCsiIiIiQUthV0RERESClsKuiIiIiAQthV0RERERCVoKuyIiIiIStBR2RURE\nRCRoKeyKiIiISNBS2BURERGRoFUiw66Z1TWzF81slZkdMbNkM2uQRV2Ymb1pZnvNLMHMPjGzc7Ko\nK29mz5rZTjNL9B23TRZ1ZmYPmVmcmR01s/Vm1qOwrlNERERECleJDLtAE+AG4ACwEnDZ1P0b6Ajc\nDfQAygLLzaxOhrpJwG3Ao0AX4HdgkZk1z1A3BhgBTAA6A6uB2WbWuaAXJCIiIiJFr0xxN5AV59yn\nwGkAZnYbXqBNx8y6A5cCUc65lb6xL4E44EHgPt/YeUBvINo5F+sbWwn8ADwOXOsbqwU8ADzpnIvx\nneZTM2sKPAUsLJSLFREREZFCU1Lv7ObF34GdKUEXwDkXDywAuqep6wYcB2alqTsBvAt0MrOyvuHO\neHeGp2U4z1TgXDNrGPArEBEREZFCVSLv7ObR2cD3WYz/APzDzCo55xKBs4A459yxLOrK4U2Z2Oir\nS3LObcmiznzbfw1g/4XO9uzE9u8u7jYycTVq4yIyzjTJvxMnTjB16lTeeecd4uLi+OOPP6hXrx7d\nu3dnwIABVKtWLV39nj17GD16NJ988gmHDh2iXr163HjjjQwZMoSyZctmcxYREREpzUpz2A3Hm7KQ\n0QHf9+pAoq/uYA514Wm+H8pDXalh+3dT6akhxd1GJonDYwISdm+55RY++ugj/va3v3HjjTdyyimn\n8Pnnn/PUU08xd+5cli1bRsWKFQEv6LZr147ff/+drl27EhkZyerVqxk7dixr165l9uzZBe5HRERE\nSp7SHHblJPbNN9/w0Ucfcckll/Dhhx8SEvLXjJx+/fqxYMEC5s2bx0033QTAiBEj2LlzJy+88ALR\n0dGptQMHDuTdd99l+vTp9OnTp6gvQyTVziN/svtocr72qV0xhDqV9Z9xEZGclOb/Sh7Eu3ubUXia\n7SnfMy1blqbuQJq6sDzUZWnz5s3Zbqtbty6VKlXKaXfJp23btgHQtm3bdEEXoGPHjsyfP599+/YB\nkJCQwNy5c2nUqFG6oAswcuRIZs2aRWxsbKkLu4mJiezYsaNQz5HT37UE1t4KETz8n6R87fPkBeU5\nsnNPQM6vz/rkoM/55BGIzzrj//uaF0ePHi3yv7OmTZvmuL00h90fgKuyGD8L+M03Xzel7lozq5Bh\n3u7ZeA+u/ZKmrryZNXbObc1Q54Afc2omt1+0BNYZZ5wBwIoVKxg2bBinnHJK6rZFixYREhJC69at\nAVi7di1JSUlERUVlOk7t2rU555xz+Prrrzl+/DjlypUrmgsIgEqVKhXq393mzZv1d12EEvYdB/IX\nditWrEjT+gX/jPRZnxz0OZ88AvVZ79y5M9/7VKxYkTp1Cj5VMZBK82oM84G6aV8OYWaheKs0zEtT\ntwDvQbSeaepOAW4EFjnn/vANLwT+BPpmOM/NwPfOuVL1cFqwO/vss7njjjtYs2YNl156KQ899BCP\nPvooV1xxBStWrOD555/n/PPPB2DLFu+Zw8aNG2d5rMjISE6cOJF6t1hERESCR4m9s2tm1/v+2RJv\nNYRrzGwvsNe33Nh84Etgqpk9iPdw2UO+fZ5NOY5zbr2ZzQTGmVk5vIfaBgKN8NbfTanba2YvAA+Z\nWQLwDXATcCVegJYS5plnnqF+/fqMHj2a119/PXX8hhtuoF27dqk/x8fHY2aEhoZmeZyU8fj4+MJt\nWERERIpciQ27wGz+enOaA172/ftToJ1zzplZF+A537YKwCrgSudcxomM0cATwGi8ebnfAp2cc99m\nqHsY+B9wD3AqsAno6Zz7OIDXJQHgnOPee+9l7ty5xMTE0LlzZ8qWLcunn37KsGHDaN++PcuWLaN+\n/frF3aqIiIgUoxIbdp1zuU6xcM4dAm73feVUlwQM9X3lVOeAJ31fUoK98847vPPOOzz77LP07fvX\nzJO///3vlC1blt69ezNu3Dief/55QkNDcc5le+c2ZTy7O78iIiJSepXmObtyEluyZAlmxuWXX55p\nW8qDaRs2bAC8ObkAW7duzVQL3pzekJAQGjVqVDjNioiISLFR2JVSKSnJe2p9//79mbalLDmWsrJC\ny5YtKVeuHMuXL89Uu3v3br7//nsuuuiiUrUSg4iIiOSNwq6USq1atcI5R0xMDH/88UfquHOOsWPH\nYma0aeMt1FG1alV69OjBtm3bmDRpUrrjjBo1iuTkZG655ZYi7V9ERESKRomdsyuSk9tvv50ZM2aw\nfPlyWrVqRfv27SlTpgwrV67kxx9/pGnTpgwYMCC1ftSoUXz22WcMGzaMFStW0KRJE1atWsWaNWvo\n0KEDvXv3zuFsIiIiUlop7AYxV6M2icNjiruNTFyN2gU+RmhoKEuWLCEmJoaPP/6YqVOnAlC/fn3u\nuece7r//fqpVq5ZaX7t2bZYtW8aYMWNYvHgxixcvpl69ejz88MPce++9Be5HRERESiaF3SDmIurg\nIkrWW0wCqVq1aowaNYpRo0blqT4iIoIJEyYUblMiIiJSomjOroiIiIgELYVdEREREQlaCrsiIiIi\nErQUdkVEREQkaCnsioiIiEjQUtgVERERkaClsCsiIiIiQUthV0RERESClsKuiIiIiAQthV0RERER\nCVoKuyIiIiIStBR2RURERCRoKeyKiIiISNBS2BURERGRoFWmuBuQwpOc+DsuaU9xt5GJlY8gpNJp\nBT7OrFmzWLVqFevXr2fjxo0cP36cKVOm0K1bt2z3+eabbxg/fjxffvklhw4dombNmpx//vk8/PDD\nnH322elqjx8/TkxMDLNnz2b79u2EhYXRsWNHHn30USIiIgrcv4iIiBQ+hd0g5pL2cOw//1fcbWRS\n4YKnIQBhd8yYMWzfvp2aNWsSERHBjh07cqyfPHkyDzzwAOHh4XTu3JnatWuzZ88evvrqK3788cd0\nYdc5R+/evVm2bBkXXXQR3bp1Iy4ujmnTprFixQqWLl1KrVq1CnwNIiIiUrgUdqXUevHFF2nSpAl1\n69blqaee4plnnsm2dt26dQwdOpRWrVoxa9YsqlSpkm57cnJyup+nTZvGsmXL6NmzJxMnTkw3PmjQ\nIEaOHMkrr7wS2AsSERGRgNOcXSm12rZtS926dfNU+8QTTwDw2muvZQq6ACEh6f9PITY2FjNjxIgR\n6cb79u1Ls2bNmDNnDkeOHPGzcxERESkqCrsS9A4dOsSnn37KeeedR4MGDVi5ciUTJkzgtddeY/36\n9Znqk5KS+Prrr2natCn16tXLtL19+/YkJSWxbt26omhfRERECkDTGCToffvttzjnOO200+jVqxeL\nFy/GzABvbu51113H66+/TtmyZQGIi4sjOTmZxo0bZ3m8yMhInHNs2bKFtm3bFtl1iIiISP7pzq4E\nvf379wOwcOFCNmzYwOzZs/nvf//L559/zmWXXcacOXMYM2ZMan18fDwAoaGhWR4vZTylTkREREou\nhV0JeikPnyUnJxMTE0OHDh2oXLkyZ511Fu+88w5Vq1blrbfe4o8//ijmTkVERCTQFHYl6KXciT3l\nlFPo0KFDum3h4eG0bNmSxMRENm3alK4+uzu3ud35FRERkZJDYVeCXpMmTQCoWLEip5xySqbtKaH1\n2LFjADRq1IiQkBC2bt2a5fG2bNmCmREZGVlIHYuIiEigKOxK0GvcuDF169YlISGBXbt2Zdr+888/\nA1C/fn0AKlSoQIsWLdi8eTPbt2/PVL9kyRLKly9PixYtCrdxERERKTCFXTkpREdH45xLXW83xXvv\nvcfGjRtp1aoVtWvXTh3v168fzjkee+yxdPVTp05l06ZN9OjRI8v1ekVERKRk0dJjUmrFxsby5Zdf\nArBhwwacc7zxxhssXLgQgC5dutClSxcABg0axKJFi5g2bRo//fQTl1xyCdu2beOjjz6iWrVqvPDC\nC+mO3adPH+bMmcP777/Ptm3baN26NXFxcSxYsID69eszatSoIr1WERER8Y/CbhCz8hFUuODp4m4j\nEysfEZDjfPnll7z77rt/HdeML774IvXnhg0bpobdChUqMH/+fJ577jk++OADJk6cSLVq1bj++usZ\nPnx4pjV1zYwZM2Ywbtw4Zs6cyauvvkpYWBg333wzjzzyCLVq1QrINYiIiEjhMudccfdQah0+fFi/\nPAlamzdvpmnTpsXdxknjP/uOM2TVoXztE3NZGBfULFfgc+uzPjnocz55BOqz3rlzJx9++GG+9unS\npQt16tQp8Ln9Va1aNcs4pjm7IiIiIhK0FHZFREREJGgp7IqIiIhI0FLYFREREZGgpbArIiIiIkFL\nYVdEREREgpbCroiIiIgELYVdEREREQlaCrsiIiIiErQUdkVEREQkaCnsioiIiEjQUtgVERERkaCl\nsCsiIiIiQatMcTcghedA/B4OH9lf3G1kUq1yDcJDIwp0jKSkJEaNGsX69euJi4vj4MGDhIeH07Rp\nU26//Xa6deuWWpuYmMiCBQtYuHAhGzZsYMeOHZQrV45zzjmHW2+9leuvvz7Lcxw/fpyYmBhmz57N\n9u3bCQsLo2PHjjz66KNERBSsfxERESkaCrtB7PCR/Uxa9FRxt5HJrZ2GFzjsHjlyhNjYWFq0aMHV\nV19NjRo12LdvHwsXLqRfv35ER0cTExMDwOrVqxkwYAA1atSgbdu2dO/enb1797JgwQJuv/12vvrq\nK5555pl0x3fO0bt3b5YtW8ZFF11Et27diIuLY9q0aaxYsYKlS5dSq1atAl2DiIiIFD6FXSmVwsPD\n+fXXXylTJv2fcGJiIu3bt2fKlCncfffdNGnShIiICCZOnMh1112Xrn7EiBG0a9eON998k969e3PB\nBRekbps2bRrLli2jZ8+eTJw4Md34oEGDGDlyJK+88krhX6iIiIgUiObsSqmVMegCVKpUiXbt2gEQ\n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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2b00de96a250>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = df.pivot(columns='ncores').plot.bar()\n",
    "plt.xlabel('Number of strings')\n",
    "plt.legend(['40','80','160','320','640'], loc='upper left', title='Number of cores')\n",
    "plt.ylabel('time (seconds)')\n",
    "ax.set_xticklabels(df.index.unique(), rotation=30)\n",
    "plt.tight_layout()\n",
    "plt.savefig('compute_scaling.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df.to_csv('timing_data.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Trying Altair"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import altair\n",
    "from altair import Chart, X, Y, Color, Column, Scale, expr, Axis, Formula, Legend, LegendConfig"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "LegendConfi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df = pd.read_csv('../cdr3_analyze_benchmark.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nstrings</th>\n",
       "      <th>ncores</th>\n",
       "      <th>spark</th>\n",
       "      <th>type</th>\n",
       "      <th>min_ld</th>\n",
       "      <th>max_ld</th>\n",
       "      <th>dt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>10</td>\n",
       "      <td>True</td>\n",
       "      <td>graph</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>0.002437</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>215</td>\n",
       "      <td>10</td>\n",
       "      <td>True</td>\n",
       "      <td>graph</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>0.010117</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>464</td>\n",
       "      <td>10</td>\n",
       "      <td>True</td>\n",
       "      <td>graph</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>0.046256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1000</td>\n",
       "      <td>10</td>\n",
       "      <td>True</td>\n",
       "      <td>graph</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>0.227567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2154</td>\n",
       "      <td>10</td>\n",
       "      <td>True</td>\n",
       "      <td>graph</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>8.599866</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   nstrings  ncores spark   type  min_ld  max_ld        dt\n",
       "0       100      10  True  graph       1      10  0.002437\n",
       "1       215      10  True  graph       1      10  0.010117\n",
       "2       464      10  True  graph       1      10  0.046256\n",
       "3      1000      10  True  graph       1      10  0.227567\n",
       "4      2154      10  True  graph       1      10  8.599866"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"vega-embed\" id=\"eeef4a2b-f781-4c15-b97a-d821691f5cf8\"></div>\n",
       "\n",
       "<style>\n",
       ".vega-embed svg, .vega-embed canvas {\n",
       "  border: 1px dotted gray;\n",
       "}\n",
       "\n",
       ".vega-embed .vega-actions a {\n",
       "  margin-right: 6px;\n",
       "}\n",
       "</style>\n"
      ]
     },
     "metadata": {
      "jupyter-vega": "#eeef4a2b-f781-4c15-b97a-d821691f5cf8"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "application/javascript": [
       "var spec = {\"data\": {\"values\": [{\"ncores\": 10, \"nstrings\": 100, \"dt\": 0.002437114715576172}, {\"ncores\": 10, \"nstrings\": 215, \"dt\": 0.010116815567016602}, {\"ncores\": 10, \"nstrings\": 464, \"dt\": 0.046255826950073235}, {\"ncores\": 10, \"nstrings\": 1000, \"dt\": 0.2275669574737549}, {\"ncores\": 10, \"nstrings\": 2154, \"dt\": 8.599865913391112}, {\"ncores\": 10, \"nstrings\": 4641, \"dt\": 6.9468770027160645}, {\"ncores\": 10, \"nstrings\": 10000, \"dt\": 9.353269100189207}, {\"ncores\": 10, \"nstrings\": 21544, \"dt\": 20.62661695480347}, {\"ncores\": 10, \"nstrings\": 46415, \"dt\": 62.150463819503784}, {\"ncores\": 20, \"nstrings\": 1000, \"dt\": 0.22919321060180664}, {\"ncores\": 20, \"nstrings\": 1000, \"dt\": 0.2311251163482666}, {\"ncores\": 20, \"nstrings\": 1668, \"dt\": 11.287612199783325}, {\"ncores\": 20, \"nstrings\": 2782, \"dt\": 8.293555021286009}, {\"ncores\": 20, \"nstrings\": 4641, \"dt\": 8.639877080917357}, {\"ncores\": 20, \"nstrings\": 7742, \"dt\": 10.493359088897703}, {\"ncores\": 20, \"nstrings\": 12915, \"dt\": 9.759709119796751}, {\"ncores\": 20, \"nstrings\": 21544, \"dt\": 37.68866491317749}, {\"ncores\": 20, \"nstrings\": 100000, \"dt\": 139.15834403038022}, {\"ncores\": 20, \"nstrings\": 200000, \"dt\": 502.06964707374567}, {\"ncores\": 40, \"nstrings\": 200000, \"dt\": 270.8043029308319}, {\"ncores\": 40, \"nstrings\": 1000, \"dt\": 0.2281019687652588}, {\"ncores\": 40, \"nstrings\": 1668, \"dt\": 11.366989850997925}, {\"ncores\": 40, \"nstrings\": 2782, \"dt\": 10.132143020629883}, {\"ncores\": 40, \"nstrings\": 4641, \"dt\": 11.162296056747437}, {\"ncores\": 40, \"nstrings\": 7742, \"dt\": 10.568097829818727}, {\"ncores\": 40, \"nstrings\": 12915, \"dt\": 11.1456139087677}, {\"ncores\": 40, \"nstrings\": 100000, \"dt\": 93.83039689064026}, {\"ncores\": 40, \"nstrings\": 400000, \"dt\": 1002.1000208854676}, {\"ncores\": 80, \"nstrings\": 400000, \"dt\": 522.9388349056244}, {\"ncores\": 80, \"nstrings\": 200000, \"dt\": 156.97476601600647}, {\"ncores\": 80, \"nstrings\": 1000, \"dt\": 0.2269530296325684}, {\"ncores\": 80, \"nstrings\": 1668, \"dt\": 12.6478590965271}, {\"ncores\": 80, \"nstrings\": 2782, \"dt\": 10.170419931411745}, {\"ncores\": 80, \"nstrings\": 4641, \"dt\": 10.059844970703123}, {\"ncores\": 80, \"nstrings\": 7742, \"dt\": 16.6340548992157}, {\"ncores\": 80, \"nstrings\": 12915, \"dt\": 10.574331998825071}, {\"ncores\": 80, \"nstrings\": 21544, \"dt\": 12.102138996124268}, {\"ncores\": 80, \"nstrings\": 35938, \"dt\": 16.504433155059814}, {\"ncores\": 80, \"nstrings\": 59948, \"dt\": 27.33076286315918}, {\"ncores\": 80, \"nstrings\": 100000, \"dt\": 47.53882789611816}, {\"ncores\": 320, \"nstrings\": 400000, \"dt\": 154.10178518295288}, {\"ncores\": 320, \"nstrings\": 800000, \"dt\": 580.3845510482787}, {\"ncores\": 320, \"nstrings\": 200000, \"dt\": 52.01744508743286}, {\"ncores\": 320, \"nstrings\": 100000, \"dt\": 24.50803804397583}, {\"ncores\": 320, \"nstrings\": 59948, \"dt\": 20.634816884994507}, {\"ncores\": 320, \"nstrings\": 35936, \"dt\": 18.0288770198822}, {\"ncores\": 625, \"nstrings\": 800000, \"dt\": 301.7174530029297}, {\"ncores\": 625, \"nstrings\": 1600000, \"dt\": 1059.6586909294126}, {\"ncores\": 160, \"nstrings\": 50000, \"dt\": 11.290836095809937}, {\"ncores\": 160, \"nstrings\": 100000, \"dt\": 19.122159957885746}, {\"ncores\": 160, \"nstrings\": 200000, \"dt\": 69.57920908927917}, {\"ncores\": 160, \"nstrings\": 400000, \"dt\": 258.30107498168945}]}, \"encoding\": {\"y\": {\"field\": \"dt\", \"type\": \"quantitative\", \"axis\": {\"title\": \"Time (seconds)\", \"tickLabelFontSize\": 15.0, \"titleFontSize\": 15.0, \"format\": \"f\"}}, \"color\": {\"field\": \"ncores\", \"type\": \"nominal\", \"legend\": {\"title\": \"Number of cores\"}}, \"column\": {\"field\": \"nstrings\", \"scale\": {\"padding\": 4.0}, \"type\": \"ordinal\", \"axis\": {\"axisWidth\": 1.0, \"title\": \"Number of strings\", \"titleFontSize\": 15.0, \"offset\": -8.0, \"tickLabelFontSize\": 15.0, \"orient\": \"bottom\"}}, \"x\": {\"field\": \"ncores\", \"type\": \"ordinal\", \"axis\": false}}, \"config\": {\"cell\": {\"width\": 500, \"height\": 350}, \"facet\": {\"cell\": {\"strokeWidth\": 0.0}}, \"legend\": {\"titleFontSize\": 15.0, \"labelFontSize\": 15.0}}, \"transform\": {\"filter\": \"((datum.nstrings>=100000)&&(datum.ncores>10))\"}, \"mark\": \"bar\"};\n",
       "var selector = \"#eeef4a2b-f781-4c15-b97a-d821691f5cf8\";\n",
       "var type = \"vega-lite\";\n",
       "\n",
       "var output_area = this;\n",
       "require(['nbextensions/jupyter-vega/index'], function(vega) {\n",
       "  vega.render(selector, spec, type, output_area);\n",
       "}, function (err) {\n",
       "  if (err.requireType !== 'scripterror') {\n",
       "    throw(err);\n",
       "  }\n",
       "});\n"
      ]
     },
     "metadata": {
      "jupyter-vega": "#eeef4a2b-f781-4c15-b97a-d821691f5cf8"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {
      "jupyter-vega": "#eeef4a2b-f781-4c15-b97a-d821691f5cf8"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Chart(df[['ncores','nstrings','dt']]).mark_bar().encode(\n",
    "    color=Color('ncores:N', legend=Legend(title=u'Number of cores')),\n",
    "    column=Column('nstrings:O',\n",
    "        axis=Axis(\n",
    "            axisWidth=1.0,\n",
    "            offset=-8.0,\n",
    "            orient='bottom',\n",
    "            title='Number of strings',\n",
    "            tickLabelFontSize=15.,\n",
    "            titleFontSize=15\n",
    "        ),\n",
    "        scale=Scale(\n",
    "            padding=4.0,\n",
    "        )\n",
    "    ),\n",
    "    x=X('ncores:O',\n",
    "        axis=False),\n",
    "    y=Y('dt',\n",
    "        axis=Axis(format='f',\n",
    "                  title='Time (seconds)', \n",
    "                  tickLabelFontSize=15,\n",
    "                  titleFontSize=15),\n",
    "        ),\n",
    ").transform_data(\n",
    "    filter=((expr.df.nstrings >= 100000) & (expr.df.ncores > 10))\n",
    ").configure_facet_cell(\n",
    "    strokeWidth=0.0,\n",
    ").configure_legend(\n",
    "    labelFontSize=15,\n",
    "    titleFontSize=15,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
